package zeepos.service.impl;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;

import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import com.mongodb.client.MongoCursor;

import springtest.utils.ClassUtil;
import zeepos.mongo.MongoSolrData;
import zeepos.repository.ImportSolrReposity;
import zeepos.service.ImportSolrService;

@Service
public class ImportSolrServiceImpl implements ImportSolrService {

	@Autowired
	private MongoSolrData mongoSolrData;
	@Autowired
	private ImportSolrReposity importSolrReposity;
	// 在配置文件中决定solr集合的名字
	@Value("${solr.collection}")
	private String solrCollection;
	// 决定集合的长度
	@Value("${list.size}")
	private int listSize;

	public void importSolr() {
		List exceptionList = new ArrayList();
		try {
			// 取得包下所有完整类名
			Set<String> className = ClassUtil.getClassName("springtest.pojo", false);
			for (String string : className) {
				// 获得entity所对应的mon中的集合名
				String collectionName = string.split("\\.")[2].toUpperCase();
				// 获得对应的pojo
				Class<?> classtype = Class.forName(string);
				Constructor con = classtype.getDeclaredConstructor();
				// new一个pojo
				Object solrPojo = con.newInstance();
				// 获得该pojo对应的所有属性
				Field[] declaredFields = classtype.getDeclaredFields();
				// 使用游标去mongodb查询数据
				MongoCursor<Document> cursor = mongoSolrData.getAllDate(collectionName);
				List result = new ArrayList();
				// 遍历数据
				while (cursor.hasNext()) {
					Document object = cursor.next();
					exceptionList.add(object.get("_id"));
					for (Field field : declaredFields) {
						// 禁用安全检查
						field.setAccessible(true);
						String name = field.getName();
						// 获得pojo属性的类型
						Class<?> type = field.getType();
						String typeName = type.getTypeName();
						Object value = object.get(name);
						// 判断是否为String类型
						if (value != null && value != "") {
							if (typeName.equals("java.lang.String")) {
								field.set(solrPojo, value.toString());
							}
							if (typeName.equals("java.util.Date")) {
								field.set(solrPojo, (Date) value);
							}
						}
					}
					// 把对象放入集合中
					result.add(solrPojo);
					// 如果集合中数据超过一百条就提交保存一次
					if (result.size() > listSize) {
						int errorNumber = importSolrReposity.importSolr(collectionName, result);
						result.clear();
					}
				}
				if (result.size() > 0) {
					int errorNumber = importSolrReposity.importSolr(collectionName, result);
					result.clear();
				}
			}
		} catch (Exception e) {
			System.out.println(exceptionList.toString());
			// 打印异常信息
			e.printStackTrace();
		}
	}
}
